/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package it.illumedellaragione.googlecalendar;

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Properties;


public class ManageConfig {


        final static String KEY = "1llum3d3ll4r4g10n3z4n376";
        final static String [] secrets ={"user","pwd"};

      /**
      *    COTRUTTORE PRIVATO
      */
      private ManageConfig() {
            
      }
      /**
       * <br><b>public static synchronized String getString(String key) </b><br><hr>
       * QUESTO METODO PERMETTE DI RECUPERARE UN VALORE DAL FILE CONFIG.PROPERTIES
       *
       * <br><b>ReadOnly</b><br>
       * @param pKey DI TIPO STRING
     * @return VALORE DI KEY SE PRESENTE - ALTRIMENTI STRINGA VUOTA
     *
     */
      public static synchronized String getString(String fileProperties, String pKey) {
          //VALORE DI RITORNO
          String myReturn="";
          //NUOVA ISTANZA PROPERTIES
          Properties props = new Properties();

          try {
              //CARICO IL FILE DI CONFIGURAZIONE
              props.load(new FileInputStream(fileProperties));
              //LEGGO IL VALORE DI RITORNO
              myReturn = props.getProperty(pKey);

              if (isSecrets(pKey))
              {
                  myReturn = decrypt(myReturn);
              }

          } catch(Exception e) {
                // utility.showSimpleMessage("ERRORE NELLA LETTURA DEL FILE CONFIG.PRPERTIES NELLA CHIAVE: " + pKey + "\nERRORE: " + e.getMessage());
          }
          //RITORNA myReturn OPPURE UNA STRINGA VUOTA
          return myReturn ;

      }

    /**
     * <br><b>public static synchronized void  setProperty(String key, String value)</b><br><hr>
     * QUESTO METODO PERMETTE DI SCRIVERE UN VALORE NEL FILE CONFIG.PROPERTIES
     *
     * <br><b>WriteOnly</b><br>
     * @param pKey DI TIPO STRING - RAPPRESENTA LA CHIAVE DA INSERIRE
     * @param pValue DI TIPO STRING - RAPPRESENTA IL VALORE CHE SI VUOLE ATTRIBUIRE ALLA CHIAVE
     *
     *
     */
      public static synchronized void  setProperty(String fileProperties, String pKey, String pValue)  {
          //CREO UNA NUOVA ISTANZA DI PROPERTIES
          Properties properties = new Properties();

          try {
              //CARICO IL FILE
              properties.load(new FileInputStream(fileProperties));
                  //SCRIVO LA CHIAVE
              if (isSecrets(pKey))
                  properties.setProperty(pKey, encrypt(pValue));
              else
                  properties.setProperty(pKey, pValue);
            } catch (IOException e) {

                //Utility.showSimpleMessage("ERRORE NELLA LETTURA DEL FILE: " + fileProperties + "\nERRORE: " + e.getMessage());
                System.out.println("ERRORE NELLA LETTURA DEL FILE: " + fileProperties + "\nERRORE: " + e.getMessage());
            }



            //SALVO IL FILE
            try {
                properties.store(new FileOutputStream("config.properties"), null);
            } catch (IOException e) {
                //Utility.showSimpleMessage("ERRORE NEL SALVATAGGIO DEL FILE " + fileProperties + "\nERRORE: " + e.getMessage());
                 System.out.println("ERRORE NEL SALVATAGGIO DEL FILE " + fileProperties + "\nERRORE: " + e.getMessage());
            }
    }

        private static boolean isSecrets(String key){
            for (int i= 0; i < secrets.length; i++) 
                if (secrets[i].equalsIgnoreCase(key)) return true;
            return false;
        }

      /**
	 * Encrypt a string using a key
	 *
	 * @param str
	 * @param resourcemap
	 * @return
	 */
	public static String encrypt(String str) {
	    try {
	        String encryptionKey = KEY;

	        StringEncrypter encrypter =  new StringEncrypter(StringEncrypter.DES_ENCRYPTION_SCHEME, encryptionKey );
	        String encryptedString = encrypter.encrypt( str );

	        return encryptedString;
	    }
	    catch (Exception e) {
	        e.printStackTrace();
	        // do nothing
	    }

	    return null;
	}

	/**
	 * Decrypt a string using a key
	 *
	 * @param str
	 * @param resourcemap
	 * @return
	 */
	public static String decrypt(String str) {
	    try {
	        String encryptionKey = KEY;

	        StringEncrypter decrypter =  new StringEncrypter(StringEncrypter.DES_ENCRYPTION_SCHEME, encryptionKey );
	        String decryptedString = decrypter.decrypt(str);

	        return decryptedString;
	    }
	    catch (Exception e) {
	        // do nothing
    }

	    return null;
	}

}
